package com.xie.common.constants;


//constants 常量
/**
 * @author Gim
 * @Date 2019-09-12
 */

//这个&是交集.<T extends A & B> 代表A的子类型和B的子类型的交集.
//除了交集&以外,并集|也有用到,不过是在catch块里,多个异常类型可以用|隔开.
public interface BaseEnum<T extends Enum<T> & BaseEnum<T>> {

  /**
   * 获取code码存入数据库
   *
   * @return 获取编码
   */
  Integer getCode();

  /**
   * 获取编码名称，便于维护
   *
   * @return 获取编码名称
   */
  String getName();

  /**
   * 根据code码获取枚举
   *
   * @param cls enum class
   * @param code enum code
   * @return get enum
   */
  static <T extends Enum<T> & BaseEnum<T>> T parseByCode(Class<T> cls, Integer code) {
    for (T t : cls.getEnumConstants()) {
      if (t.getCode().intValue() == code.intValue()) {
        return t;
      }
    }
    return null;
  }

//  // 方式二、放入map中，通过键取值
//   static Map<Integer,MaterialOutEnterEnum > zyMap = new HashMap<>();
//  static {
//    for (MaterialOutEnterEnum value : MaterialOutEnterEnum .values()) {
//      zyMap.put(value.getCode(),value);
//    }
//  }
//  public static MaterialOutEnterEnum getByCode(Integer code){
//    return zyMap.get(code);
//  }


}